package com.tarena.lbs.activity.rpc;

import com.tarena.lbs.activity.api.ActivityApi;
import com.tarena.lbs.activity.api.pojo.ActivityDto;
import com.tarena.lbs.activity.pojo.vo.ActivityVO;
import com.tarena.lbs.activity.service.ActivityService;
import com.tarena.lbs.base.protocol.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@DubboService
public class ActivityApiImpl implements ActivityApi {

    @Autowired
    private ActivityService activityService;

    /**
     * 检查用户是否满足活动目标人群范围（RPC接口）
     * 供其他服务调用，验证用户是否可以参与活动
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return true表示满足，false表示不满足
     */
    @Override
    public Boolean activityVisible(Integer userId, Integer activityId) {
        log.info("[RPC] 检查用户是否满足活动目标人群范围，userId={}, activityId={}", userId, activityId);
        try {
            return activityService.activityVisible(userId, Long.valueOf(activityId));
        } catch (Exception e) {
            log.error("[RPC] 检查用户是否满足活动目标人群范围失败", e);
            return false;
        }
    }

    /**
     * 根据ID查询活动详情（RPC接口）
     * 供其他服务调用，获取活动的详细信息
     * @param activityId 活动ID
     * @return 活动DTO对象
     */
    @Override
    public ActivityDto getActivityById(Integer activityId) {
        log.info("[RPC] 通过RPC获取活动详情，activityId={}", activityId);
        try {
            // 将Integer类型转换为Long类型调用服务层方法
            ActivityVO activityVO = activityService.getActivityById(Long.valueOf(activityId));
            if (activityVO == null) {
                log.warn("[RPC] 活动不存在，activityId={}", activityId);
                return null;
            }
            // 转换VO对象为DTO对象
            ActivityDto activityDto = new ActivityDto();
            BeanUtils.copyProperties(activityVO, activityDto);
            return activityDto;
        } catch (BusinessException e) {
            log.error("[RPC] 获取活动详情业务异常：{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            log.error("[RPC] 获取活动详情系统异常", e);
            throw new RuntimeException("获取活动详情失败");
        }
    }
}
